home *** CD-ROM | disk | FTP | other *** search
- package java.util;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import sun.misc.SharedSecrets;
-
- public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements Serializable, Cloneable {
- private final Class<K> keyType;
- private transient K[] keyUniverse;
- private transient Object[] vals;
- private transient int size = 0;
- private static final Object NULL = new Object();
- private static Enum[] ZERO_LENGTH_ENUM_ARRAY = new Enum[0];
- private transient Set<Map.Entry<K, V>> entrySet = null;
- private static final long serialVersionUID = 458661240069192865L;
-
- private Object maskNull(Object var1) {
- return var1 == null ? NULL : var1;
- }
-
- private V unmaskNull(Object var1) {
- return (V)(var1 == NULL ? null : var1);
- }
-
- public EnumMap(Class<K> var1) {
- this.keyType = var1;
- this.keyUniverse = getKeyUniverse(var1);
- this.vals = new Object[this.keyUniverse.length];
- }
-
- public EnumMap(EnumMap<K, ? extends V> var1) {
- this.keyType = var1.keyType;
- this.keyUniverse = var1.keyUniverse;
- this.vals = var1.vals.clone();
- this.size = var1.size;
- }
-
- public EnumMap(Map<K, ? extends V> var1) {
- if (var1 instanceof EnumMap) {
- EnumMap var2 = (EnumMap)var1;
- this.keyType = var2.keyType;
- this.keyUniverse = var2.keyUniverse;
- this.vals = var2.vals.clone();
- this.size = var2.size;
- } else {
- if (var1.isEmpty()) {
- throw new IllegalArgumentException("Specified map is empty");
- }
-
- this.keyType = ((Enum)var1.keySet().iterator().next()).getDeclaringClass();
- this.keyUniverse = getKeyUniverse(this.keyType);
- this.vals = new Object[this.keyUniverse.length];
- this.putAll(var1);
- }
-
- }
-
- public int size() {
- return this.size;
- }
-
- public boolean containsValue(Object var1) {
- var1 = this.maskNull(var1);
-
- for(Object var5 : this.vals) {
- if (var1.equals(var5)) {
- return true;
- }
- }
-
- return false;
- }
-
- public boolean containsKey(Object var1) {
- return this.isValidKey(var1) && this.vals[((Enum)var1).ordinal()] != null;
- }
-
- private boolean containsMapping(Object var1, Object var2) {
- return this.isValidKey(var1) && this.maskNull(var2).equals(this.vals[((Enum)var1).ordinal()]);
- }
-
- public V get(Object var1) {
- return (V)(this.isValidKey(var1) ? this.unmaskNull(this.vals[((Enum)var1).ordinal()]) : null);
- }
-
- public V put(K var1, V var2) {
- this.typeCheck(var1);
- int var3 = var1.ordinal();
- Object var4 = this.vals[var3];
- this.vals[var3] = this.maskNull(var2);
- if (var4 == null) {
- ++this.size;
- }
-
- return (V)this.unmaskNull(var4);
- }
-
- public V remove(Object var1) {
- if (!this.isValidKey(var1)) {
- return null;
- } else {
- int var2 = ((Enum)var1).ordinal();
- Object var3 = this.vals[var2];
- this.vals[var2] = null;
- if (var3 != null) {
- --this.size;
- }
-
- return (V)this.unmaskNull(var3);
- }
- }
-
- private boolean removeMapping(Object var1, Object var2) {
- if (!this.isValidKey(var1)) {
- return false;
- } else {
- int var3 = ((Enum)var1).ordinal();
- if (this.maskNull(var2).equals(this.vals[var3])) {
- this.vals[var3] = null;
- --this.size;
- return true;
- } else {
- return false;
- }
- }
- }
-
- private boolean isValidKey(Object var1) {
- if (var1 == null) {
- return false;
- } else {
- Class var2 = var1.getClass();
- return var2 == this.keyType || var2.getSuperclass() == this.keyType;
- }
- }
-
- public void putAll(Map<? extends K, ? extends V> var1) {
- if (var1 instanceof EnumMap) {
- EnumMap var2 = (EnumMap)var1;
- if (var2.keyType != this.keyType) {
- if (var2.isEmpty()) {
- return;
- }
-
- throw new ClassCastException(var2.keyType + " != " + this.keyType);
- }
-
- for(int var3 = 0; var3 < this.keyUniverse.length; ++var3) {
- Object var4 = var2.vals[var3];
- if (var4 != null) {
- if (this.vals[var3] == null) {
- ++this.size;
- }
-
- this.vals[var3] = var4;
- }
- }
- } else {
- super.putAll(var1);
- }
-
- }
-
- public void clear() {
- Arrays.fill(this.vals, (Object)null);
- this.size = 0;
- }
-
- public Set<K> keySet() {
- Set var1 = this.keySet;
- return var1 != null ? var1 : (this.keySet = new KeySet(this, (1)null));
- }
-
- public Collection<V> values() {
- Collection var1 = this.values;
- return var1 != null ? var1 : (this.values = new Values(this, (1)null));
- }
-
- public Set<Map.Entry<K, V>> entrySet() {
- Set var1 = this.entrySet;
- return var1 != null ? var1 : (this.entrySet = new EntrySet(this, (1)null));
- }
-
- public boolean equals(Object var1) {
- if (!(var1 instanceof EnumMap)) {
- return super.equals(var1);
- } else {
- EnumMap var2 = (EnumMap)var1;
- if (var2.keyType != this.keyType) {
- return this.size == 0 && var2.size == 0;
- } else {
- for(int var3 = 0; var3 < this.keyUniverse.length; ++var3) {
- Object var4 = this.vals[var3];
- Object var5 = var2.vals[var3];
- if (var5 != var4 && (var5 == null || !var5.equals(var4))) {
- return false;
- }
- }
-
- return true;
- }
- }
- }
-
- public EnumMap<K, V> clone() {
- Object var1 = null;
-
- try {
- var4 = (EnumMap)super.clone();
- } catch (CloneNotSupportedException var3) {
- throw new AssertionError();
- }
-
- var4.vals = var4.vals.clone();
- return var4;
- }
-
- private void typeCheck(K var1) {
- Class var2 = var1.getClass();
- if (var2 != this.keyType && var2.getSuperclass() != this.keyType) {
- throw new ClassCastException(var2 + " != " + this.keyType);
- }
- }
-
- private static <K extends Enum<K>> K[] getKeyUniverse(Class<K> var0) {
- return (K[])SharedSecrets.getJavaLangAccess().getEnumConstantsShared(var0);
- }
-
- private void writeObject(ObjectOutputStream var1) throws IOException {
- var1.defaultWriteObject();
- var1.writeInt(this.size);
-
- for(Map.Entry var3 : this.entrySet()) {
- var1.writeObject(var3.getKey());
- var1.writeObject(var3.getValue());
- }
-
- }
-
- private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- this.keyUniverse = getKeyUniverse(this.keyType);
- this.vals = new Object[this.keyUniverse.length];
- int var2 = var1.readInt();
-
- for(int var3 = 0; var3 < var2; ++var3) {
- Enum var4 = (Enum)var1.readObject();
- Object var5 = var1.readObject();
- this.put(var4, var5);
- }
-
- }
-
- // $FF: synthetic method
- static int access$200(EnumMap var0) {
- return var0.size;
- }
-
- // $FF: synthetic method
- static Object access$500(EnumMap var0, Object var1) {
- return var0.maskNull(var1);
- }
-
- // $FF: synthetic method
- static Object[] access$600(EnumMap var0) {
- return var0.vals;
- }
-
- // $FF: synthetic method
- static int access$210(EnumMap var0) {
- return var0.size--;
- }
-
- // $FF: synthetic method
- static boolean access$900(EnumMap var0, Object var1, Object var2) {
- return var0.containsMapping(var1, var2);
- }
-
- // $FF: synthetic method
- static boolean access$1000(EnumMap var0, Object var1, Object var2) {
- return var0.removeMapping(var1, var2);
- }
-
- // $FF: synthetic method
- static Enum[] access$1100(EnumMap var0) {
- return var0.keyUniverse;
- }
-
- // $FF: synthetic method
- static Object access$1200(EnumMap var0, Object var1) {
- return var0.unmaskNull(var1);
- }
-
- // $FF: synthetic method
- static Object access$1400() {
- return NULL;
- }
- }
-